﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data;

public partial class ProcesoSeleccion_FrVerProcesoSeleccion : System.Web.UI.Page
{
    
    protected void Page_Load(object sender, EventArgs e)
    {

        if (Request.QueryString["ProcesoInd"] == null)
            Response.Redirect("../Principal.aspx");

        //-------------------------Lineas Agregadas para la seguridad----------------------------------------------------
        if (Session["nit"] != null)
        {
            
            
            PanelPracticante.Visible = false;
        }

        else if (Session["nomUsr"] != null)
        {
            List<String> Permisos = (List<String>)Session["Permisos"];
            if (!Permisos.Contains(System.IO.Path.GetFileName(HttpContext.Current.Request.FilePath)))
                Response.Redirect("/SUEWebSite/Error.aspx");
            if (Session["rolUsuario"].ToString() == "practicante")
            {
                PanelResEmpresa.Visible = false;
                PanelResEmpresa1.Visible = false;
            }

        }
        else Response.Redirect("/SUEWebSite/Principal.aspx");
        //-------------------------Lineas Agregadas para la seguridad----------------------------------------------------

        if (!Page.IsPostBack)
        {
                                  

            CargarProcesoSeleccion(Convert.ToInt32(Request.QueryString["ProcesoInd"]));
            CargarFormatos();
            EliminarArchivoSiExiste("");
        }
        CargarProcesoSeleccion(Convert.ToInt32(Request.QueryString["ProcesoInd"]));
        limpiar();
    }

    /// <summary>
    /// carga la información de un proceso de selección dado el identificador del procesos de selección
    /// Se consulta el nombre de la empresa dado el identificador de la empresa
    /// Si el practicante o empresa trata de ingresar a un proceso de selección que no corresponde es re dirigido a la página 
    /// de error.
    /// Se Muestra un link para cambiar el estado de la hoja de vida si su estado es "Rechazada", visible para 
    /// la empresa y un usaurio con permisos diferente a practicante
    /// </summary>
    /// <param name="idProceso">(int) Identificador proceso selección</param>
   private void CargarProcesoSeleccion(int idProceso)
    {
        try
        {
            GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();
            DataTable dt = proceso.ObtProcesoEspecifico(idProceso);
            string empresa;
            Empresa emp = new Empresa();
            empresa = emp.ConsEmpresaPorIdPractica(Convert.ToInt32(dt.Rows[0]["Practica_idPractica"]));

            if (Session["nit"] != null && Session["nombreEmp"].ToString() != empresa)
                Response.Redirect("../error.aspx");

            CargarCartas(dt.Rows[0]["Practica_idPractica"].ToString(), dt.Rows[0]["Practicante_Usuario_nombreUsuario"].ToString());
            LabelNombre.Text = dt.Rows[0]["nombre"].ToString() + " " + dt.Rows[0]["apellido"].ToString();
            idPracticaLab.Text = dt.Rows[0]["Practica_idPractica"].ToString();
            nombreUsuariolab.Text = dt.Rows[0]["Practicante_Usuario_nombreUsuario"].ToString();

            if (Session["nomUsr"] != null && Session["rolUsuario"].ToString() == "practicante")
                if (nombreUsuariolab.Text != Session["nomUsr"].ToString())
                    Response.Redirect("../error.aspx");

            if (dt.Rows[0]["estadoHojaVida"].ToString() == "Rechazada")
                LinkButtonCambioHV.Visible = true;
            else
                LinkButtonCambioHV.Visible = false;


            GestionarPracticas practica = new GestionarPracticas();
            DataTable dtPractica = practica.ObtPracticaEspecifica(Convert.ToInt32(idPracticaLab.Text));
            if (dtPractica.Rows[0]["estadoPractica"].ToString() != "activa")
            {
                PanelResEmpresa.Enabled = false;
                PanelResEmpresa1.Enabled = false;
                PanelPracticante.Enabled = false;
                FileFormato.Visible = false;
                ButtonSubir.Visible = false;

            }
        }
        catch
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('No se pudo cargar la información', {timeout: 2 , showClose: false });", true);
        }
    }
   
    /// <summary>
    /// Se cargan las cartas que han sido subidas buscando por el identificador de la practica y el nombre de usuario
    /// 
    /// </summary>
    /// <param name="idPractica"></param>
    /// <param name="nombreUsuario"></param>
    private void CargarCartas(string idPractica, string nombreUsuario)
    {
        DirectoryInfo mydir = new DirectoryInfo(Server.MapPath("../Archivo/ProcesosSeleccion/" + idPractica + "/" + nombreUsuario));
        GridViewCartas.DataSource = mydir.GetFiles();
        GridViewCartas.DataBind();
        LinkArchivo(idPractica, nombreUsuario);
    }

    /// <summary>
    /// Genera el link a real de los documentos subidos, para poder ser descargados
    /// </summary>
    /// <param name="idPractica"></param>
    /// <param name="nombreUsuario"></param>
     private void  LinkArchivo(string idPractica, string nombreUsuario)
     {
         string archivo;
         foreach (GridViewRow row in GridViewCartas.Rows)
         {
             if (row.RowType == DataControlRowType.DataRow)
             {
                 
                 HyperLink hl = (HyperLink)row.Cells[0].Controls[0];
                 if (hl.Text != "")
                 {
                     archivo = hl.Text;
                     hl.NavigateUrl = "/SUEWebSite/Archivo/ProcesosSeleccion/"+idPractica+"/"+nombreUsuario+"/"+archivo;
                 }

             }
         }
     }

    /// <summary>
    /// Carga todos los formatos que se han subido, buscando en la carpeta FormCartas
    /// </summary>
    private void CargarFormatos()
    {
        DirectoryInfo mydir = new DirectoryInfo(Server.MapPath("../Archivo/FormCartas"));
        GridViewFormCartas.DataSource = mydir.GetFiles();
        GridViewFormCartas.DataBind();
        
    }

   

    /// <summary>
    /// Hace invisible los archivos que no corresponden a los subidos, especificamente Thumbs.db 
    /// </summary>
     private void limpiar()
    {
        foreach (GridViewRow row in GridViewFormCartas.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                HyperLink hl = (HyperLink)row.Cells[0].Controls[0]; 
                if (hl.Text == "Thumbs.db")
                    hl.Visible = false;
            }
        }
        foreach (GridViewRow row in GridViewCartas.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                HyperLink hl = (HyperLink)row.Cells[0].Controls[0];
                
                
                if (hl.Text == "Thumbs.db")
                {
                    hl.Enabled = false;
                    hl.Text = "";
                }
            }
        }
    }

    /// <summary>
    /// Sube un archivo, con el nombre del checkbox marcado para identificar su estado.
    /// Se verifica cual checkBox ha sido marcado y se mofica el estado en la base de datos 
    /// Si se trata de subir un arhcivo que ya ha sido subido se elimina el anterior y se reemplaza con el nuevo
    /// /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
     protected void ButtonSubir_Click(object sender, EventArgs e)
     {
         string seleccion = validarCheckBox();
         if (seleccion != "" && seleccion != "no")
         {
             if ((FileFormato.PostedFile != null) && (FileFormato.PostedFile.ContentLength > 0))
             {
                 string ext = System.IO.Path.GetExtension(FileFormato.PostedFile.FileName);
                 string SaveLocation = (Server.MapPath("../Archivo/ProcesosSeleccion/" + idPracticaLab.Text + "/" + nombreUsuariolab.Text + "/" + seleccion + ext));

                 try
                 {
                     GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();
                     DataTable dt = proceso.ObtProcesoEspecifico(Convert.ToInt32(Request.QueryString["ProcesoInd"]));
                     EliminarArchivoSiExiste(seleccion);
                     FileFormato.PostedFile.SaveAs(SaveLocation);

                     string estado ="";
                     string hojaVida = dt.Rows[0]["estadoHojaVida"].ToString();
                     string estadoAcept = dt.Rows[0]["estadoAcepacion"].ToString();
                     string estadoSeleccion = dt.Rows[0]["estadoSeleccion"].ToString();
                     int idProceso = Convert.ToInt32(Request.QueryString["ProcesoInd"]);

                     if (seleccion == "Hoja de vida rechazada")
                         estado = "Rechazada";
                     if(estado != "")
                         proceso.ModProcesoSeleccion(estado, estadoSeleccion, estadoAcept, idProceso);
                     estado = "";

                     if (seleccion == "Estudiante Seleccionado")
                         estado = "Seleccionado";
                     else if (seleccion == "Estudiante NO Seleccionado")
                         estado = "No Seleccionado";
                     if (estado != "")
                         if(hojaVida == "")
                         proceso.ModProcesoSeleccion("Aceptada", estado, estadoAcept, idProceso);
                         else
                             proceso.ModProcesoSeleccion(hojaVida, estado, estadoAcept, idProceso);   

                     estado = "";

                     if (seleccion == "Práctica Aceptada")
                         estado = "Acepto";
                     else if (seleccion == "Práctica No Aceptada")
                         estado = "Rechazo";
                     if(estado !="")
                     proceso.ModProcesoSeleccion(hojaVida, estadoSeleccion, estado, idProceso);

                     LabelNotificacion.Text = "Archivo subido con éxito";
                     ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.success('Carta de notificación subida con éxito', {timeout: 3 , showClose: false });", true);

                 }
                 catch (Exception ex)
                 {
                     LabelNotificacion.Text = "No se pudo subir el archivo " + ex.Message;
                 }
             }
             else
             {
                 LabelNotificacion.Text = "Seleccione un archivo";
             }
             CargarCartas(idPracticaLab.Text, nombreUsuariolab.Text);
         }
         else if(seleccion == "no")
             ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('Debe seleccionar solo una opción', {timeout: 3 , showClose: false });", true);
         else
             ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('Debe seleccionar una opción', {timeout: 3 , showClose: false });", true);
         
     }

    /// <summary>
    /// Verifica que checkBox a sido elegigo por el usaurio se retorna el texto del checkBox seleccionado y retorna 
    /// el valo según sea el caso
    /// </summary>
     /// <returns>Caso 1. Se selecciona solo una opción: Se retorna el texto del checkBox
     /// Caso 2. Se ha marcado mas de una opción: se retorna el valor "no". indicando que no se puede llevar
     /// a cabo la operación
     /// Caso 3. no se ha seleccionado ninguna opción: Se retorna el valor "" indicando que no se ha seleccionado nada
     /// </returns>
     private string validarCheckBox()
     {
         int cont = 0;
         string seleccionado = "";
         if (CheckBoxRechazo.Checked)
         {
             seleccionado = CheckBoxRechazo.Text;
             cont++;
         }
         if (CheckBoxSeleccionado.Checked)
         {
             seleccionado = CheckBoxSeleccionado.Text;
             cont++;
         }
         if (CheckBoxNoSeleccionado.Checked)
         {
             cont++;
             seleccionado = CheckBoxNoSeleccionado.Text;
         }
         if (CheckBoxAcepto.Checked)
         {
             cont++;
             seleccionado = CheckBoxAcepto.Text;
         }
         if (CheckBoxNoAcepto.Checked)
         {
             cont++;
             seleccionado = CheckBoxNoAcepto.Text;
         }
         if (cont == 1)
             return seleccionado;
         if (cont > 1)
             return "no";
         else
             return "";
     }
    /// <summary>
    /// Verifica si el nombre del archivo ha sido subido de ser asi elimina el archivo.
    /// </summary>
    /// <param name="archivoEli"></param>
     private void EliminarArchivoSiExiste(string archivoEli)
     {
         try
         {
             string archivo;
             string[] files = Directory.GetFiles(Server.MapPath("../Archivo/ProcesosSeleccion") + "\\" + idPracticaLab.Text + "\\" + nombreUsuariolab.Text);
             if (files.Length > 0)
             {
                 foreach (string file in files)
                 {

                     FileInfo finfo = new FileInfo(file);
                     archivo = finfo.Name.Replace(finfo.Extension, "");
                     if (archivoEli == archivo)
                         File.Delete(file);
                 }

             }
         }
         catch 
         {
             ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('No se pudo cargar la información', {timeout: 2 , showClose: false });", true);
         }
     }
/*
     protected void LinkButtonCambioHV_Click(object sender, EventArgs e)
     {

     }
  */
    /// <summary>
    /// Al hacer clic Cambia el estado de la hoja de vida a "Aceptada"
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
     protected void LinkButtonCambioHV_Click1(object sender, EventArgs e)
     {
         GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();
         DataTable dt = proceso.ObtProcesoEspecifico(Convert.ToInt32(Request.QueryString["ProcesoInd"]));
         string estadoAcept = dt.Rows[0]["estadoAcepacion"].ToString();
         string estadoSeleccion = dt.Rows[0]["estadoSeleccion"].ToString();
         proceso.ModProcesoSeleccion("Aceptada", estadoSeleccion, estadoAcept, Convert.ToInt32(Request.QueryString["ProcesoInd"]));
         LinkButtonCambioHV.Visible = false;
     }
    /// <summary>
    /// Al hacer Clic re direcciona la página de consultar procesos de selección pasando por parametro el identidficador
    /// de la práctica 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
     protected void LinkButtonAtras_Click(object sender, EventArgs e)
     {
         Response.Redirect("FrConsProcesosSeleccion.aspx?idPractica=" + idPracticaLab.Text);
     }
}
